(*用于判断一个字符串是否是一个合法的“标识符”（identifier）。
该标识符的规则如下（从代码逻辑推断）：
必须非空；
必须以小写字母结尾；
字符串中只能包含小写字母、数字或连字符 -；
连字符不能连续出现（即不能有两个 - 相邻）；
连字符不能出现在字符串末尾（因为末尾必须是字母）；
连字符也不能出现在字符串开头 *)

let identifier =
  let is_letter c = 'a' <= c && c <= 'z' in
  let is_letter_or_digit c = is_letter c || ('0' <= c && c <= '9') in
  let rec is_valid s i not_after_dash =
    if i < 0 then not_after_dash
    else if is_letter_or_digit s.[i] then is_valid s (i - 1) true
    else if s.[i] = '-' && not_after_dash then is_valid s (i - 1) false
    else false in
  fun s -> (
      let n = String.length s in
    n > 0 && is_letter s.[n - 1] && is_valid s (n - 2) true);;

identifier "this-is-a-long-identifier";;
